//
// Created by fh on 2021/6/1.
//

#ifndef CDEMO_LINKSTACK_H
#define CDEMO_LINKSTACK_H

#include <stdio.h>
#include <stdlib.h>
#include "CustomDefine.h"

/* 链栈:用单链表实现的栈
 * 这里说明一下这个定义:struct后面的StackNode是结构标签名tag,最后那个StackNode是定义的整个结构体的别名，
 * 它们不冲突，因为使用的时候你可以用struct StackNode来声明一个结构，也可以单用StackNode来声明一个结构,
 * 例如下面根据这个结构体定义的LinkStackPtr，下面两种方式都可以使用，StackNode可以作为一个结构标签名使用，
 * 也可以当作定义的别名使用，具体demo里会给出 */
typedef struct StackNode {
    int data;
    struct StackNode *next;
} StackNode;

//typedef struct StackNode *LinkStackPtr;
//typedef StackNode *LinkStackPtr;

typedef struct LinkStack {
    StackNode *top;
    int count;
} LinkStack;

/* 链栈生成和初始化 */
LinkStack *LinkStackCreateAndInit();
/* 插入元素e为新的栈顶元素 */
Status LinkStackPush(LinkStack *s,int e);
/* 若栈不空，则删除s的栈顶元素，用e返回其值 */
Status LinkStackPop(LinkStack *s,int *e);
/* 遍历链栈 */
Status LinkStackDisplay(LinkStack *s);
/* 测试demo */
void linkStackTestDemo();

#endif //CDEMO_LINKSTACK_H
